package com.hospital.controller;

import com.hospital.entity.Doctor;
import com.hospital.service.DoctorService;
import com.hospital.vo.Response;
import com.hospital.vo.ResponseVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;

import javax.print.Doc;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;


/**
 * 医生控制层类
 * @author coder_zzm
 * @date 2022/5/13 23:49
 */
@Slf4j
@RestController
@RequestMapping("/doctor")
public class DoctorController {

    @Autowired
    private DoctorService doctorService;

    /**
     * 日期添加处理方法
     * @param binder 参数
     */
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        dateFormat.setLenient(false);
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
    }

    /**
     * 获取所有医生信息
     * @param pageNum 页码
     * @param pageSize 每页显示数量
     * @return 医生信息列表
     */
    @GetMapping("/getAllAndPage")
    public ResponseVO getAllAndPage(@RequestParam(defaultValue = "1") Integer pageNum,
                                    @RequestParam(defaultValue = "5") Integer pageSize) {
        log.info("控制层开始查询所有医生信息...");
        return doctorService.getAllAndPage(pageNum, pageSize);
    }

    /**
     * 查询医生详细信息
     * @param dId 医生编号
     * @return 医生详细信息
     */
    @GetMapping("/getDoctorDetail")
    public ResponseVO getDoctorDetail(String dId) {
        log.info("控制层查询医生详细信息...");
        return doctorService.getDoctorDetail(dId);
    }

    /**
     * 添加医生信息
     * @param doctor 医生实体类
     * @return 医生信息是否添加成功
     */
    @PostMapping("/addDoctor")
    public ResponseVO addDoctor(Doctor doctor) {
        log.info("控制层添加医生信息...");
        return doctorService.addDoctor(doctor);
    }

    /**
     * 根据医生编号删除医生信息
     * @param dId 医生编号
     * @return 受影响行数
     */
    @PostMapping("/delGetById")
    public ResponseVO delDoctorGetById(Integer dId) {
        log.info("控制层删除医生信息...");
        return doctorService.delDoctorGetById(dId);
    }

    /**
     * 根据医生编号修改医生信息
     * @param doctor 医生实体类
     * @return 医生信息是否修改成功
     */
    @PutMapping("/updateDoctor")
    public ResponseVO updateDoctor(Doctor doctor) {
        log.info("控制层修改医生信息...");
        return doctorService.updateDoctor(doctor);
    }

    /**
     * 根据时间查询最后一条记录方法
     * @return 单条记录
     */
    @GetMapping("/getLastDoctor")
    public Doctor getLastDoctor() {
        log.info("控制层根据时间查询最后的一条信息...");
        return doctorService.getLastDoctor();
    }

    /**
     * 根据医生姓名查询信息方法
     * @param dName 医生姓名
     * @return 多条记录
     */
    @GetMapping(value = "/getDoctorByName")
    public Response getDoctorByName(String dName) {
        log.info("控制层根据医生姓名查询信息方法");
        List<Doctor> doctorByName = doctorService.getDoctorByName(dName);
        return new Response(200, "success", doctorByName);
    }
}
